////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2016-2017 Qualcomm Technologies, Inc.
// All Rights Reserved.
// Confidential and Proprietary - Qualcomm Technologies, Inc.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// @file  camxjpeghufftable.h
/// @brief JPEG Huffman table class
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

/// @todo (CAMX-1988) Code clean up apply NC001 coding standard on entire project
/// @todo (CAMX-1989) Code clean up apply GR030 coding standard on entire project

#ifndef CAMXJPEGHUFFTABLE_H
#define CAMXJPEGHUFFTABLE_H

#include "camxdefs.h"
#include "camxtypes.h"
#include "camxutils.h"

CAMX_NAMESPACE_BEGIN

static const UINT32 HuffBitsSize   = 17;       ///< Huffman table bits size
static const UINT32 HuffValuesSize = 256;      ///< Huffman table value size

/// @brief Huffman table
struct HuffTable
{
    UINT8 bits[HuffBitsSize];      ///< Huffman table bits
    UINT8 values[HuffValuesSize];  ///< huffman table values
};

/// @brief Huffman table types
enum class HuffTableType
{
    HuffTableMin,                    ///< Huffman table min
    HuffTableLumaAC = HuffTableMin,  ///< Huffman table type luma AC
    HuffTableChromaAC,               ///< Huffman table type chroma AC
    HuffTableLumaDC,                 ///< Huffman table type luma DC
    HuffTableChromaDC,               ///< Huffman table type Chroma DC
    HuffTableMax,                    ///< Huffman table max
};

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// @brief Class for jpeg huffman table
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
class JPEGHuffTable
{
public:
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// JPEGHuffTable
    ///
    /// @brief  Default constructor
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    JPEGHuffTable();

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// JPEGHuffTable
    ///
    /// @brief  Constructor with huffman type as input
    ///
    /// @param  type Quantization tabel type
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    explicit JPEGHuffTable(
        HuffTableType type);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// ~JPEGHuffTable
    ///
    /// @brief  Destructor
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    ~JPEGHuffTable();

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// SetTable
    ///
    /// @brief  Sets the huffman tabel value
    ///
    /// @param  pTable  Pointer to table
    ///
    /// @return return CamxResult
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    CamxResult SetTable(
        HuffTable* pTable);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// SetDefaultTable
    ///
    /// @brief  Sets the default huffman table
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    void SetDefaultTable();

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// GetTable
    ///
    /// @brief  Gets the huffman table configured
    ///
    /// @return pointer to Huffman tabel
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    CAMX_INLINE HuffTable* GetTable()
    {
        return &m_table;
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// SetType
    ///
    /// @brief  Sets the Huffman tabel type
    ///
    /// @param  type Huffman tabel type
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    CAMX_INLINE void SetType(
        HuffTableType type)
    {
        m_type = type;
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// GetType
    ///
    /// @brief  Gets the Huffman tabel type
    ///
    /// @return Huffman table type
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    CAMX_INLINE HuffTableType GetType()
    {
        return m_type;
    }

private:
    JPEGHuffTable(const JPEGHuffTable&) = delete;                 ///< Disallow the copy constructor.
    JPEGHuffTable& operator=(const JPEGHuffTable&) = delete;      ///< Disallow assignment operator.

    HuffTableType m_type;            ///< Huffman table type
    HuffTable     m_table;           ///< Huffman table
};

CAMX_NAMESPACE_END

#endif // CAMXJPEGHUFFTABLE_H
